package arithmetic.other;

/**
 * @author zhangyanqi
 * @since 1.0 2018/3/20
 * <p>
 * 匪警请拨110,即使手机欠费也可拨通！
 * 为了保障社会秩序，保护人民群众生命财产安全，警察叔叔需要与罪犯斗智斗勇，因而需要经常性地进行体力训练和智力训练！
 * <p>
 * 某批警察叔叔正在进行智力训练：
 * 1 2 3 4 5 6 7 8 9 = 110
 * <p>
 * 请看上边的算式，为了使等式成立，需要在数字间填入加号或者减号（可以不填，但不能填入其它符号）。之间没有填入符号的数字组合成一个数，例如：12+34+56+7-8+9 就是一种合格的填法；123+4+5+67-89 是另一个可能的答案。
 * <p>
 * 请你利用计算机的优势，帮助警察叔叔快速找到所有答案。
 * 每个答案占一行。形如：
 * 12+34+56+7-8+9
 * 123+4+5+67-89
 * ......
 */
public class 算式填符号 {

    /**
     * 思路：
     * 从最后一位数向前加
     */

    static void getAnswer(int[] array, int index, int goal, String out) {
        if (index == 0) {
            if (array[0] == goal) {
                System.out.println(array[0] + ""+ out);
                return;
            } else {
                return;
            }
        }
        //add i
        getAnswer(array, index - 1, goal - array[index], "+" + array[index] + out);
        //delete i
        getAnswer(array, index - 1, goal + array[index], "-" + array[index] + out);
        //与i合并
        int old = array[index - 1];
        array[index - 1] = Integer.parseInt("" + array[index - 1] + old);
        getAnswer(array, index - 1, goal, out);
        array[index - 1] = old;

    }

    public static void main(String[] args) {
        int[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9};
        getAnswer(array, array.length - 1, 110, "");
    }
}
